#pragma once
#include <string>
#include "boost\graph\adjacency_list.hpp"

namespace AST{
//forward declare needed types before they are defined
class Node;
struct vertexProps;

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, vertexProps> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor vertexDesc;
typedef boost::graph_traits<Graph>::edge_descriptor edgeDesc;
//typedef std::map<Node*,Node*> NodeMatchesMap;
typedef struct{Node* matchingNode; float sim;} Match;
typedef std::map<Node*,Match> NodeMatchesMap;
typedef boost::graph_traits<Graph>::vertex_iterator VertexIterator;

struct MatchInfo {
	bool matched;
	AST::Node * matchingNode;
	unsigned int leaves;
	AST::NodeMatchesMap matchedLeaves;
	vertexDesc parent;
	bool first;
	float sim;
	bool someChange;
};


struct vertexProps {
	std::string vertexName;
	Node* nodeObject;
	MatchInfo matchInfo;
};

} //namespace AST